package org.beetl.sql.experimental.iohao.mapper;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.NoOp;

/**
 * <BR>
 * create time : 2017-04-14 16:39
 *
 * @author luoyizhu@gmail.com
 */
@Deprecated
public class HancerKit {

    public static <T> T enhance(Class<T> targetClass, CallbackFilter callbackFilter, Callback... callbacks) {
        Enhancer enhancer = new Enhancer();
        // 设置过滤器，过滤不需要添加代理功能的方法
        enhancer.setCallbackFilter(callbackFilter);
        // 目标类，将会在这个类的方法上添加额外职责功能
        enhancer.setSuperclass(targetClass);

        // 代理对象，第一个是空代理，也就是不做任何操作。后面N个是代理对象，负责给类增强的职责。
        int len = callbacks.length + 1;
        Callback[] calls = new Callback[len];
        calls[0] = NoOp.INSTANCE;
        for (int i = 0; i < callbacks.length; i++) {
            // 下标对应代理类
            calls[i + 1] = callbacks[i];
        }

        enhancer.setCallbacks(calls);

        // 将业务类与代理融合，生成一个新对象，并且有额外职责的功能
        return (T) enhancer.create();
    }
}
